package br.com.minhascontas.DAO;

import java.util.ArrayList;
import java.util.List;

import br.com.minhascontas.model.Lancamentos;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class LancamentoDAO extends SQLiteOpenHelper {

	private static int DATABASE_VERSION = 2;
	private static final String DATABASE = "minhasContas";
	private static String GRUPO_TABLE_NAME = "grupo";
	private static String ITEMGRUPO_TABLE_NAME = "itemGrupo";
	private static String LANCAMENTOS_TABLE_NAME = "lancamentos";

	public LancamentoDAO(Context context) {
		super(context, DATABASE, null, DATABASE_VERSION);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}

	private Lancamentos load(Cursor c) {

		Lancamentos lancamento = new Lancamentos();

		lancamento.setId(c.getLong(0));
		lancamento.setValor(c.getDouble(1));
		lancamento.setObservacao(c.getString(2));
		lancamento.setIdGrupo(c.getInt(3));
		lancamento.setIdItemGrupo(c.getInt(4));
		lancamento.setDia(c.getInt(5));
		lancamento.setMes(c.getInt(6));
		lancamento.setAno(c.getInt(7));
		lancamento.setIsDebito(c.getInt(10));
		lancamento.setNomeGrupo(c.getString(11));
		lancamento.setNomeItemGrupo(c.getString(13));

		return lancamento;
	}

	public List<Lancamentos> listarAnos() {
		List<Lancamentos> lancamentos = new ArrayList<Lancamentos>();

		String strSql = "select DISTINCT ano from " + LANCAMENTOS_TABLE_NAME
				+ ";";

		Cursor c = getWritableDatabase().rawQuery(strSql, null);

		while (c.moveToNext()) {
			Lancamentos lancamento = new Lancamentos();
			lancamento.setAno(c.getInt(0));
			lancamentos.add(lancamento);
		}

		return lancamentos;
	}

	public void inserirLancamento(Lancamentos lancamento) {
		ContentValues values = new ContentValues();

		int idGrupo = (int) (long) lancamento.getGrupo().getId();
		int idItemGrupo = (int) (long) lancamento.getItemGrupo().getId();

		values.put("valor", lancamento.getValor());
		values.put("observacao", lancamento.getObservacao());
		values.put("dia", lancamento.getDia());
		values.put("mes", lancamento.getMes());
		values.put("ano", lancamento.getAno());
		values.put("idGrupo", idGrupo);
		values.put("idItemGrupo", idItemGrupo);
		values.put("data", lancamento.getData());
		values.put("debito", lancamento.getIsDebito());

		getWritableDatabase().insert(LANCAMENTOS_TABLE_NAME, null, values);

	}

	public void alterarLancamento(Lancamentos lancamento) {
		ContentValues values = new ContentValues();

		int idGrupo = (int) (long) lancamento.getGrupo().getId();
		int idItemGrupo = (int) (long) lancamento.getItemGrupo().getId();

		values.put("valor", lancamento.getValor());
		values.put("observacao", lancamento.getObservacao());
		values.put("dia", lancamento.getDia());
		values.put("mes", lancamento.getMes());
		values.put("ano", lancamento.getAno());
		values.put("idGrupo", idGrupo);
		values.put("idItemGrupo", idItemGrupo);
		values.put("data", lancamento.getData());
		values.put("debito", lancamento.getIsDebito());

		getWritableDatabase().update(LANCAMENTOS_TABLE_NAME, values, "id=?",
				new String[] { lancamento.getId().toString() });

	}

	public List<Lancamentos> listarLancamentosByMesANDAno(int ano, int mes) {
		List<Lancamentos> lancamentos = new ArrayList<Lancamentos>();

		String strSql = "select * from " + LANCAMENTOS_TABLE_NAME + " "
				+ " INNER JOIN grupo ON " + LANCAMENTOS_TABLE_NAME
				+ ".idGrupo = " + GRUPO_TABLE_NAME + ".id  "
				+ " INNER JOIN itemGrupo ON " + LANCAMENTOS_TABLE_NAME
				+ ".idItemGrupo = " + ITEMGRUPO_TABLE_NAME + ".id "
				+ " WHERE ano = " + ano + " AND mes = " + mes + ";";

		Cursor c = getWritableDatabase().rawQuery(strSql, null);

		while (c.moveToNext()) {

			lancamentos.add(load(c));

		}
		c.close();
		
		return lancamentos;
	}

	public List<Lancamentos> listarLancamentosByPeriodo(String dateDe,
			String dataAte) {
		List<Lancamentos> lancamentos = new ArrayList<Lancamentos>();

		StringBuilder strSql = new StringBuilder();
		strSql.append(" select * from " + LANCAMENTOS_TABLE_NAME + " ");
		strSql.append(" INNER JOIN grupo ON " + LANCAMENTOS_TABLE_NAME
				+ ".idGrupo = grupo.id ");
		strSql.append(" INNER JOIN itemGrupo ON " + LANCAMENTOS_TABLE_NAME
				+ ".idItemGrupo = itemGrupo.id ");
		strSql.append(" WHERE data between '" + dateDe + "' AND '" + dataAte
				+ "' order by data");

		Cursor c = getWritableDatabase().rawQuery(strSql.toString(), null);

		while (c.moveToNext()) {
			lancamentos.add(load(c));
		}
		c.close();
		return lancamentos;
	}

	public List<Lancamentos> listarLancamentosByGrupo(int intIdGrupo) {
		List<Lancamentos> lancamentos = new ArrayList<Lancamentos>();

		StringBuilder strSql = new StringBuilder();
		strSql.append(" select * from " + LANCAMENTOS_TABLE_NAME + " ");
		strSql.append(" INNER JOIN grupo ON " + LANCAMENTOS_TABLE_NAME
				+ ".idGrupo = grupo.id ");
		strSql.append(" INNER JOIN itemGrupo ON " + LANCAMENTOS_TABLE_NAME
				+ ".idItemGrupo = itemGrupo.id ");
		strSql.append(" WHERE " + LANCAMENTOS_TABLE_NAME + ".idGrupo = "
				+ intIdGrupo + " order by data");

		Cursor c = getWritableDatabase().rawQuery(strSql.toString(), null);

		while (c.moveToNext()) {
			lancamentos.add(load(c));

		}
		c.close();
		return lancamentos;
	}

	public List<Lancamentos> listarLancamentosByItem(int idItemGrupo) {
		List<Lancamentos> lancamentos = new ArrayList<Lancamentos>();

		StringBuilder strSql = new StringBuilder();
		strSql.append(" select * from " + LANCAMENTOS_TABLE_NAME + " ");
		strSql.append(" INNER JOIN grupo ON " + LANCAMENTOS_TABLE_NAME
				+ ".idGrupo = grupo.id ");
		strSql.append(" INNER JOIN itemGrupo ON " + LANCAMENTOS_TABLE_NAME
				+ ".idItemGrupo = itemGrupo.id ");
		strSql.append(" WHERE idItemGrupo = " + idItemGrupo + " order by data");

		Cursor c = getWritableDatabase().rawQuery(strSql.toString(), null);

		while (c.moveToNext()) {
			lancamentos.add(load(c));
		}
		c.close();
		return lancamentos;
	}

}
